{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 本模块实现特征衍生"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "# base\n",
    "import math\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import sys\n",
    "import datetime\n",
    "import re\n",
    "# data process\n",
    "from sklearn.preprocessing import OneHotEncoder\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.preprocessing import PolynomialFeatures, LabelBinarizer\n",
    "from pandas.api.types import is_numeric_dtype\n",
    "from pandas.api.types import is_string_dtype\n",
    "from sklearn.feature_extraction import DictVectorizer\n",
    "import seaborn as sns\n",
    "# model\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression, LogisticRegressionCV, LogisticRegression\n",
    "from sklearn.metrics import accuracy_score, roc_auc_score,f1_score\n",
    "from sklearn.ensemble import (RandomTreesEmbedding, RandomForestClassifier,\n",
    "                              GradientBoostingClassifier)\n",
    "import xgboost as xgb\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.externals import joblib\n",
    "import lightgbm as lgb\n",
    "# model test\n",
    "from sklearn.metrics import roc_curve, auc\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 合并处理训练样本和预测样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1368146, 56)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PERSONID</th>\n",
       "      <th>APPLYNO</th>\n",
       "      <th>FTR0</th>\n",
       "      <th>FTR1</th>\n",
       "      <th>FTR2</th>\n",
       "      <th>FTR3</th>\n",
       "      <th>FTR4</th>\n",
       "      <th>FTR5</th>\n",
       "      <th>FTR6</th>\n",
       "      <th>FTR7</th>\n",
       "      <th>...</th>\n",
       "      <th>FTR44</th>\n",
       "      <th>FTR45</th>\n",
       "      <th>FTR46</th>\n",
       "      <th>FTR47</th>\n",
       "      <th>FTR48</th>\n",
       "      <th>FTR49</th>\n",
       "      <th>FTR50</th>\n",
       "      <th>FTR51</th>\n",
       "      <th>CREATETIME</th>\n",
       "      <th>LABEL</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>20fab21284e57a4ccd3127553920e37b</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.050012</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001532</td>\n",
       "      <td>A2B186C398E0D0</td>\n",
       "      <td>2015-09-14</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>73f32b8b6e199129abb8fe0cb6d6c867</td>\n",
       "      <td>0.033333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.007829</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.033333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.033333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005156</td>\n",
       "      <td>A24B176C1239E0D0</td>\n",
       "      <td>2015-09-14</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>324da7a0b1a5c1d3b321685d734a9dc8</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000023</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>A0B0C6E0D0</td>\n",
       "      <td>2015-09-14</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>341ceb4ae7b0ca1c46653f5a116d4bd2</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000023</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>A0B0C6E0D0</td>\n",
       "      <td>2015-10-16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>ca260c60e62de319e38a475e2455afb8</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.007829</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005156</td>\n",
       "      <td>A24B176C1239E0D0</td>\n",
       "      <td>2015-10-16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                           PERSONID                           APPLYNO  \\\n",
       "0  8ba94305557a4ec72435a9eb78001350  20fab21284e57a4ccd3127553920e37b   \n",
       "1  8ba94305557a4ec72435a9eb78001350  73f32b8b6e199129abb8fe0cb6d6c867   \n",
       "2  8ba94305557a4ec72435a9eb78001350  324da7a0b1a5c1d3b321685d734a9dc8   \n",
       "3  8ba94305557a4ec72435a9eb78001350  341ceb4ae7b0ca1c46653f5a116d4bd2   \n",
       "4  8ba94305557a4ec72435a9eb78001350  ca260c60e62de319e38a475e2455afb8   \n",
       "\n",
       "       FTR0  FTR1  FTR2  FTR3  FTR4      FTR5  FTR6  FTR7  ...       FTR44  \\\n",
       "0  0.050000   0.0   0.0   0.0   0.0  0.000000   0.0   0.0  ...    0.050000   \n",
       "1  0.033333   0.0   0.0   0.0   0.0  0.007829   0.0   0.0  ...    0.033333   \n",
       "2  0.050000   0.0   0.0   0.0   0.0  0.000000   0.0   0.0  ...    0.050000   \n",
       "3  0.050000   0.0   0.0   0.0   0.0  0.000000   0.0   0.0  ...    0.050000   \n",
       "4  0.050000   0.0   0.0   0.0   0.0  0.007829   0.0   0.0  ...    0.050000   \n",
       "\n",
       "   FTR45  FTR46     FTR47     FTR48  FTR49     FTR50             FTR51  \\\n",
       "0    0.0    0.0  0.000000  0.050012    0.0  0.001532    A2B186C398E0D0   \n",
       "1    0.0    0.0  0.000000  0.033333    0.0  0.005156  A24B176C1239E0D0   \n",
       "2    0.0    0.0  0.000023  0.050000    0.0  0.000000        A0B0C6E0D0   \n",
       "3    0.0    0.0  0.000023  0.050000    0.0  0.000000        A0B0C6E0D0   \n",
       "4    0.0    0.0  0.000000  0.050000    0.0  0.005156  A24B176C1239E0D0   \n",
       "\n",
       "   CREATETIME  LABEL  \n",
       "0  2015-09-14      0  \n",
       "1  2015-09-14      0  \n",
       "2  2015-09-14      0  \n",
       "3  2015-10-16      0  \n",
       "4  2015-10-16      0  \n",
       "\n",
       "[5 rows x 56 columns]"
      ]
     },
     "execution_count": 220,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 训练样本 ：(1368146, 55)，总计15000个不同的用户，日期为2015-3-1至2016-2-23，不均匀分布,正负bi：14230:770\n",
    "# data_path = \"./data/train.tsv\"\n",
    "# data_id = \"./data/train_id.tsv\"\n",
    "data_path = \"./data/train.tsv\"\n",
    "data_id = \"./data/train_id.tsv\"\n",
    "dat = pd.read_csv(data_path, sep='\\t')\n",
    "dat_id = pd.read_csv(data_id,sep=\"\\t\")\n",
    "\n",
    "train_data  = pd.merge(dat,dat_id, how=\"inner\", on=\"PERSONID\")\n",
    "\n",
    "print(train_data.shape)\n",
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1345563, 56)"
      ]
     },
     "execution_count": 221,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除每一行中空值超过40个的行 少了20万\n",
    "# [False if  train_data.loc[i,:].values.tolist().count(0) > 40  else True for i in train_data.index]\n",
    "ind = [False if i > 40 else True for i in (train_data == 0).astype(int).sum(axis=1)]\n",
    "train_data = train_data.loc[ind,:]\n",
    "train_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PERSONID</th>\n",
       "      <th>APPLYNO</th>\n",
       "      <th>FTR0</th>\n",
       "      <th>FTR1</th>\n",
       "      <th>FTR2</th>\n",
       "      <th>FTR3</th>\n",
       "      <th>FTR4</th>\n",
       "      <th>FTR5</th>\n",
       "      <th>FTR6</th>\n",
       "      <th>FTR7</th>\n",
       "      <th>...</th>\n",
       "      <th>FTR44</th>\n",
       "      <th>FTR45</th>\n",
       "      <th>FTR46</th>\n",
       "      <th>FTR47</th>\n",
       "      <th>FTR48</th>\n",
       "      <th>FTR49</th>\n",
       "      <th>FTR50</th>\n",
       "      <th>FTR51</th>\n",
       "      <th>CREATETIME</th>\n",
       "      <th>LABEL</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>d7d27cd05dd10be17a9d5339bb1596ad</td>\n",
       "      <td>d6114afdd829c6a24553bdd48ebdbf78</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000023</td>\n",
       "      <td>0.050012</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A0B0C6E0D0</td>\n",
       "      <td>2015-03-01</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>d7d27cd05dd10be17a9d5339bb1596ad</td>\n",
       "      <td>12da95c0ac1ff008196939b1706b9786</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001767</td>\n",
       "      <td>0.050012</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A0B0C3E0D0</td>\n",
       "      <td>2015-03-01</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>d7d27cd05dd10be17a9d5339bb1596ad</td>\n",
       "      <td>1fe1085070c8a8eeb7ba3b7596c6b271</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.550000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A2B307C46E0D0,A2B390C540E0D0,A36B257C339E0D0,A...</td>\n",
       "      <td>2015-03-01</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>d7d27cd05dd10be17a9d5339bb1596ad</td>\n",
       "      <td>2b9b3749b7b8d9e7c81814686bb1dba8</td>\n",
       "      <td>0.274993</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.025007</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000023</td>\n",
       "      <td>0.025000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A0B0C6E0D0</td>\n",
       "      <td>2015-05-31</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>d7d27cd05dd10be17a9d5339bb1596ad</td>\n",
       "      <td>a0e026f43eef17df34e65f5839d11fc2</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001767</td>\n",
       "      <td>0.050012</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A0B0C3E0D0</td>\n",
       "      <td>2015-05-31</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                           PERSONID                           APPLYNO  \\\n",
       "0  d7d27cd05dd10be17a9d5339bb1596ad  d6114afdd829c6a24553bdd48ebdbf78   \n",
       "1  d7d27cd05dd10be17a9d5339bb1596ad  12da95c0ac1ff008196939b1706b9786   \n",
       "2  d7d27cd05dd10be17a9d5339bb1596ad  1fe1085070c8a8eeb7ba3b7596c6b271   \n",
       "3  d7d27cd05dd10be17a9d5339bb1596ad  2b9b3749b7b8d9e7c81814686bb1dba8   \n",
       "4  d7d27cd05dd10be17a9d5339bb1596ad  a0e026f43eef17df34e65f5839d11fc2   \n",
       "\n",
       "       FTR0  FTR1  FTR2  FTR3  FTR4  FTR5  FTR6  FTR7  ...       FTR44  FTR45  \\\n",
       "0  0.050000   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.050000    0.0   \n",
       "1  0.050000   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.050000    0.0   \n",
       "2  0.050000   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.550000    0.0   \n",
       "3  0.274993   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.025007    0.0   \n",
       "4  0.050000   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.050000    0.0   \n",
       "\n",
       "   FTR46     FTR47     FTR48  FTR49  FTR50  \\\n",
       "0    0.0  0.000023  0.050012    0.0    0.0   \n",
       "1    0.0  0.001767  0.050012    0.0    0.0   \n",
       "2    0.0  0.000000  0.050000    0.0    0.0   \n",
       "3    0.0  0.000023  0.025000    0.0    0.0   \n",
       "4    0.0  0.001767  0.050012    0.0    0.0   \n",
       "\n",
       "                                               FTR51  CREATETIME  LABEL  \n",
       "0                                         A0B0C6E0D0  2015-03-01      2  \n",
       "1                                         A0B0C3E0D0  2015-03-01      2  \n",
       "2  A2B307C46E0D0,A2B390C540E0D0,A36B257C339E0D0,A...  2015-03-01      2  \n",
       "3                                         A0B0C6E0D0  2015-05-31      2  \n",
       "4                                         A0B0C3E0D0  2015-05-31      2  \n",
       "\n",
       "[5 rows x 56 columns]"
      ]
     },
     "execution_count": 222,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 需要预测的样本 ： (232502, 55)，总计2500个用户,日期为2015-3-1至2016-2-23，不均匀分布\n",
    "data_path = \"./data/test_A.tsv\"\n",
    "test_data = pd.read_csv(data_path,sep=\"\\t\")\n",
    "test_data['LABEL'] = 2\n",
    "test_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(232502, 56)"
      ]
     },
     "execution_count": 223,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1578065, 56)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PERSONID</th>\n",
       "      <th>APPLYNO</th>\n",
       "      <th>FTR0</th>\n",
       "      <th>FTR1</th>\n",
       "      <th>FTR2</th>\n",
       "      <th>FTR3</th>\n",
       "      <th>FTR4</th>\n",
       "      <th>FTR5</th>\n",
       "      <th>FTR6</th>\n",
       "      <th>FTR7</th>\n",
       "      <th>...</th>\n",
       "      <th>FTR44</th>\n",
       "      <th>FTR45</th>\n",
       "      <th>FTR46</th>\n",
       "      <th>FTR47</th>\n",
       "      <th>FTR48</th>\n",
       "      <th>FTR49</th>\n",
       "      <th>FTR50</th>\n",
       "      <th>FTR51</th>\n",
       "      <th>CREATETIME</th>\n",
       "      <th>LABEL</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>20fab21284e57a4ccd3127553920e37b</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.050012</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001532</td>\n",
       "      <td>A2B186C398E0D0</td>\n",
       "      <td>2015-09-14</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>73f32b8b6e199129abb8fe0cb6d6c867</td>\n",
       "      <td>0.033333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.007829</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.033333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.033333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005156</td>\n",
       "      <td>A24B176C1239E0D0</td>\n",
       "      <td>2015-09-14</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>324da7a0b1a5c1d3b321685d734a9dc8</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000023</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>A0B0C6E0D0</td>\n",
       "      <td>2015-09-14</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>341ceb4ae7b0ca1c46653f5a116d4bd2</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000023</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>A0B0C6E0D0</td>\n",
       "      <td>2015-10-16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8ba94305557a4ec72435a9eb78001350</td>\n",
       "      <td>ca260c60e62de319e38a475e2455afb8</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.007829</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005156</td>\n",
       "      <td>A24B176C1239E0D0</td>\n",
       "      <td>2015-10-16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                           PERSONID                           APPLYNO  \\\n",
       "0  8ba94305557a4ec72435a9eb78001350  20fab21284e57a4ccd3127553920e37b   \n",
       "1  8ba94305557a4ec72435a9eb78001350  73f32b8b6e199129abb8fe0cb6d6c867   \n",
       "2  8ba94305557a4ec72435a9eb78001350  324da7a0b1a5c1d3b321685d734a9dc8   \n",
       "3  8ba94305557a4ec72435a9eb78001350  341ceb4ae7b0ca1c46653f5a116d4bd2   \n",
       "4  8ba94305557a4ec72435a9eb78001350  ca260c60e62de319e38a475e2455afb8   \n",
       "\n",
       "       FTR0  FTR1  FTR2  FTR3  FTR4      FTR5  FTR6  FTR7  ...       FTR44  \\\n",
       "0  0.050000   0.0   0.0   0.0   0.0  0.000000   0.0   0.0  ...    0.050000   \n",
       "1  0.033333   0.0   0.0   0.0   0.0  0.007829   0.0   0.0  ...    0.033333   \n",
       "2  0.050000   0.0   0.0   0.0   0.0  0.000000   0.0   0.0  ...    0.050000   \n",
       "3  0.050000   0.0   0.0   0.0   0.0  0.000000   0.0   0.0  ...    0.050000   \n",
       "4  0.050000   0.0   0.0   0.0   0.0  0.007829   0.0   0.0  ...    0.050000   \n",
       "\n",
       "   FTR45  FTR46     FTR47     FTR48  FTR49     FTR50             FTR51  \\\n",
       "0    0.0    0.0  0.000000  0.050012    0.0  0.001532    A2B186C398E0D0   \n",
       "1    0.0    0.0  0.000000  0.033333    0.0  0.005156  A24B176C1239E0D0   \n",
       "2    0.0    0.0  0.000023  0.050000    0.0  0.000000        A0B0C6E0D0   \n",
       "3    0.0    0.0  0.000023  0.050000    0.0  0.000000        A0B0C6E0D0   \n",
       "4    0.0    0.0  0.000000  0.050000    0.0  0.005156  A24B176C1239E0D0   \n",
       "\n",
       "   CREATETIME  LABEL  \n",
       "0  2015-09-14      0  \n",
       "1  2015-09-14      0  \n",
       "2  2015-09-14      0  \n",
       "3  2015-10-16      0  \n",
       "4  2015-10-16      0  \n",
       "\n",
       "[5 rows x 56 columns]"
      ]
     },
     "execution_count": 224,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.concat([train_data,test_data], axis =0)\n",
    "print(data.shape)\n",
    "data = data.reset_index(drop=True)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {},
   "outputs": [],
   "source": [
    "numeric_fea = ['FTR0', 'FTR1', 'FTR2', 'FTR3', \n",
    "               'FTR4', 'FTR5', 'FTR6', 'FTR7', \n",
    "               'FTR8', 'FTR9', 'FTR10', 'FTR11', \n",
    "               'FTR12', 'FTR13', 'FTR14', 'FTR15', \n",
    "               'FTR16', 'FTR17', 'FTR18', 'FTR19', \n",
    "               'FTR20', 'FTR21', 'FTR22', 'FTR23', \n",
    "               'FTR24', 'FTR25', 'FTR26', 'FTR27', \n",
    "               'FTR28', 'FTR29', 'FTR30', 'FTR31', 'FTR32',\n",
    "               'FTR33', 'FTR34', 'FTR35', 'FTR36', 'FTR37',\n",
    "               'FTR38', 'FTR39', 'FTR40', 'FTR41', 'FTR42', 'FTR43', \n",
    "               'FTR44', 'FTR45', 'FTR46', 'FTR47', 'FTR48', 'FTR49',\n",
    "               'FTR50']\n",
    "\n",
    "string_fea = ['PERSONID', 'APPLYNO', 'FTR51', 'CREATETIME']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数值型预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {},
   "outputs": [],
   "source": [
    "for num_fea in  numeric_fea:\n",
    "    minn = data[num_fea].quantile(0.01)\n",
    "    maxx = data[num_fea].quantile(0.99)\n",
    "    data.loc[data[num_fea] < minn, num_fea] = minn\n",
    "    data.loc[data[num_fea] > maxx, num_fea] = maxx\n",
    "    #log处理\n",
    "    data[num_fea] = np.log(data[num_fea] + 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 特征组合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "metadata": {},
   "outputs": [],
   "source": [
    "ser = map(lambda x : x.split(\",\"),data.loc[:100,\"FTR51\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 够买最多的药\n",
    "def max_med(ser):\n",
    "    l = []\n",
    "    ser = [l.extend(i) for i in ser]\n",
    "    return max(ser.count(x) for x in set(l))\n",
    "\n",
    "# 购买最多的组合\n",
    "def max_group(ser): \n",
    "    return ser.value_counts().index[0]\n",
    "\n",
    "# 购买药的总量 \n",
    "def total_med(ser):\n",
    "    l = []\n",
    "    for i in ser:\n",
    "        l.extend(i) \n",
    "    return len(l)\n",
    "    \n",
    "# 购买药的不同种类\n",
    "def type_med(ser):\n",
    "    l = []\n",
    "    for i in ser:\n",
    "        l.extend(i) \n",
    "    return len(set(l))\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {},
   "outputs": [],
   "source": [
    "# def deal_ftr51(ser):\n",
    "    \n",
    "#     return  \n",
    "func_list = [np.mean, np.sum, np.std]\n",
    "func_dict = {i : func_list for i in numeric_fea }   \n",
    "func_dict['APPLYNO'] = ['count']\n",
    "func_dict['FTR51'] = [pd.Series.nunique,max_med,max_group,total_med,type_med]\n",
    "func_dict['LABEL'] = [np.unique]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_agg = data.groupby(\"PERSONID\").agg(func_dict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(17500, 160)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"3\" halign=\"left\">FTR0</th>\n",
       "      <th colspan=\"3\" halign=\"left\">FTR1</th>\n",
       "      <th colspan=\"3\" halign=\"left\">FTR2</th>\n",
       "      <th>FTR3</th>\n",
       "      <th>...</th>\n",
       "      <th colspan=\"3\" halign=\"left\">FTR50</th>\n",
       "      <th>APPLYNO</th>\n",
       "      <th colspan=\"5\" halign=\"left\">FTR51</th>\n",
       "      <th>LABEL</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>...</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>std</th>\n",
       "      <th>count</th>\n",
       "      <th>nunique</th>\n",
       "      <th>max_med</th>\n",
       "      <th>max_group</th>\n",
       "      <th>total_med</th>\n",
       "      <th>type_med</th>\n",
       "      <th>unique</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PERSONID</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>000e3ee6e04a8b18871e1c85ffab6e49</th>\n",
       "      <td>0.051196</td>\n",
       "      <td>4.146898</td>\n",
       "      <td>0.028574</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>81</td>\n",
       "      <td>42</td>\n",
       "      <td>0</td>\n",
       "      <td>A0B0C6E3D0</td>\n",
       "      <td>3625</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>000eba50dc8c2e3899070c6b82986814</th>\n",
       "      <td>0.050974</td>\n",
       "      <td>4.281777</td>\n",
       "      <td>0.040002</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>84</td>\n",
       "      <td>48</td>\n",
       "      <td>0</td>\n",
       "      <td>A7B25C10E5D3,A7B25C0E0D0</td>\n",
       "      <td>4795</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>00139506cbd54b670e1e6dec234190e1</th>\n",
       "      <td>0.047762</td>\n",
       "      <td>1.862719</td>\n",
       "      <td>0.004575</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>39</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "      <td>A0B0C2E1D1,A0B0C2E0D0</td>\n",
       "      <td>2763</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0014fdb3625079de4a0d2131fd860641</th>\n",
       "      <td>0.059731</td>\n",
       "      <td>9.138827</td>\n",
       "      <td>0.070888</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>153</td>\n",
       "      <td>51</td>\n",
       "      <td>0</td>\n",
       "      <td>A0B0C0E0D0</td>\n",
       "      <td>6527</td>\n",
       "      <td>16</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>001de94e8d0d152e26ad87cb409003f9</th>\n",
       "      <td>0.053725</td>\n",
       "      <td>3.116060</td>\n",
       "      <td>0.051950</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000138</td>\n",
       "      <td>0.008026</td>\n",
       "      <td>0.000306</td>\n",
       "      <td>58</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "      <td>A0B0C0E0D0,A0B0C2E4D1</td>\n",
       "      <td>2582</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 160 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                      FTR0                     FTR1            \\\n",
       "                                      mean       sum       std mean  sum  std   \n",
       "PERSONID                                                                        \n",
       "000e3ee6e04a8b18871e1c85ffab6e49  0.051196  4.146898  0.028574  0.0  0.0  0.0   \n",
       "000eba50dc8c2e3899070c6b82986814  0.050974  4.281777  0.040002  0.0  0.0  0.0   \n",
       "00139506cbd54b670e1e6dec234190e1  0.047762  1.862719  0.004575  0.0  0.0  0.0   \n",
       "0014fdb3625079de4a0d2131fd860641  0.059731  9.138827  0.070888  0.0  0.0  0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9  0.053725  3.116060  0.051950  0.0  0.0  0.0   \n",
       "\n",
       "                                 FTR2           FTR3  ...       FTR50  \\\n",
       "                                 mean  sum  std mean  ...        mean   \n",
       "PERSONID                                              ...               \n",
       "000e3ee6e04a8b18871e1c85ffab6e49  0.0  0.0  0.0  0.0  ...    0.000000   \n",
       "000eba50dc8c2e3899070c6b82986814  0.0  0.0  0.0  0.0  ...    0.000000   \n",
       "00139506cbd54b670e1e6dec234190e1  0.0  0.0  0.0  0.0  ...    0.000000   \n",
       "0014fdb3625079de4a0d2131fd860641  0.0  0.0  0.0  0.0  ...    0.000000   \n",
       "001de94e8d0d152e26ad87cb409003f9  0.0  0.0  0.0  0.0  ...    0.000138   \n",
       "\n",
       "                                                     APPLYNO   FTR51          \\\n",
       "                                       sum       std   count nunique max_med   \n",
       "PERSONID                                                                       \n",
       "000e3ee6e04a8b18871e1c85ffab6e49  0.000000  0.000000      81      42       0   \n",
       "000eba50dc8c2e3899070c6b82986814  0.000000  0.000000      84      48       0   \n",
       "00139506cbd54b670e1e6dec234190e1  0.000000  0.000000      39      21       0   \n",
       "0014fdb3625079de4a0d2131fd860641  0.000000  0.000000     153      51       0   \n",
       "001de94e8d0d152e26ad87cb409003f9  0.008026  0.000306      58      31       0   \n",
       "\n",
       "                                                                               \\\n",
       "                                                 max_group total_med type_med   \n",
       "PERSONID                                                                        \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                A0B0C6E3D0      3625       16   \n",
       "000eba50dc8c2e3899070c6b82986814  A7B25C10E5D3,A7B25C0E0D0      4795       16   \n",
       "00139506cbd54b670e1e6dec234190e1     A0B0C2E1D1,A0B0C2E0D0      2763       16   \n",
       "0014fdb3625079de4a0d2131fd860641                A0B0C0E0D0      6527       16   \n",
       "001de94e8d0d152e26ad87cb409003f9     A0B0C0E0D0,A0B0C2E4D1      2582       16   \n",
       "\n",
       "                                  LABEL  \n",
       "                                 unique  \n",
       "PERSONID                                 \n",
       "000e3ee6e04a8b18871e1c85ffab6e49      0  \n",
       "000eba50dc8c2e3899070c6b82986814      0  \n",
       "00139506cbd54b670e1e6dec234190e1      0  \n",
       "0014fdb3625079de4a0d2131fd860641      2  \n",
       "001de94e8d0d152e26ad87cb409003f9      0  \n",
       "\n",
       "[5 rows x 160 columns]"
      ]
     },
     "execution_count": 231,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(df_agg.shape)\n",
    "df_agg.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>FTR0_mean</th>\n",
       "      <th>FTR0_sum</th>\n",
       "      <th>FTR0_std</th>\n",
       "      <th>FTR1_mean</th>\n",
       "      <th>FTR1_sum</th>\n",
       "      <th>FTR1_std</th>\n",
       "      <th>FTR2_mean</th>\n",
       "      <th>FTR2_sum</th>\n",
       "      <th>FTR2_std</th>\n",
       "      <th>FTR3_mean</th>\n",
       "      <th>...</th>\n",
       "      <th>FTR50_mean</th>\n",
       "      <th>FTR50_sum</th>\n",
       "      <th>FTR50_std</th>\n",
       "      <th>APPLYNO_count</th>\n",
       "      <th>FTR51_nunique</th>\n",
       "      <th>FTR51_max_med</th>\n",
       "      <th>FTR51_max_group</th>\n",
       "      <th>FTR51_total_med</th>\n",
       "      <th>FTR51_type_med</th>\n",
       "      <th>LABEL_unique</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PERSONID</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>000e3ee6e04a8b18871e1c85ffab6e49</th>\n",
       "      <td>0.051196</td>\n",
       "      <td>4.146898</td>\n",
       "      <td>0.028574</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>81</td>\n",
       "      <td>42</td>\n",
       "      <td>0</td>\n",
       "      <td>A0B0C6E3D0</td>\n",
       "      <td>3625</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>000eba50dc8c2e3899070c6b82986814</th>\n",
       "      <td>0.050974</td>\n",
       "      <td>4.281777</td>\n",
       "      <td>0.040002</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>84</td>\n",
       "      <td>48</td>\n",
       "      <td>0</td>\n",
       "      <td>A7B25C10E5D3,A7B25C0E0D0</td>\n",
       "      <td>4795</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>00139506cbd54b670e1e6dec234190e1</th>\n",
       "      <td>0.047762</td>\n",
       "      <td>1.862719</td>\n",
       "      <td>0.004575</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>39</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "      <td>A0B0C2E1D1,A0B0C2E0D0</td>\n",
       "      <td>2763</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0014fdb3625079de4a0d2131fd860641</th>\n",
       "      <td>0.059731</td>\n",
       "      <td>9.138827</td>\n",
       "      <td>0.070888</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>153</td>\n",
       "      <td>51</td>\n",
       "      <td>0</td>\n",
       "      <td>A0B0C0E0D0</td>\n",
       "      <td>6527</td>\n",
       "      <td>16</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>001de94e8d0d152e26ad87cb409003f9</th>\n",
       "      <td>0.053725</td>\n",
       "      <td>3.116060</td>\n",
       "      <td>0.051950</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000138</td>\n",
       "      <td>0.008026</td>\n",
       "      <td>0.000306</td>\n",
       "      <td>58</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "      <td>A0B0C0E0D0,A0B0C2E4D1</td>\n",
       "      <td>2582</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 160 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                  FTR0_mean  FTR0_sum  FTR0_std  FTR1_mean  \\\n",
       "PERSONID                                                                     \n",
       "000e3ee6e04a8b18871e1c85ffab6e49   0.051196  4.146898  0.028574        0.0   \n",
       "000eba50dc8c2e3899070c6b82986814   0.050974  4.281777  0.040002        0.0   \n",
       "00139506cbd54b670e1e6dec234190e1   0.047762  1.862719  0.004575        0.0   \n",
       "0014fdb3625079de4a0d2131fd860641   0.059731  9.138827  0.070888        0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9   0.053725  3.116060  0.051950        0.0   \n",
       "\n",
       "                                  FTR1_sum  FTR1_std  FTR2_mean  FTR2_sum  \\\n",
       "PERSONID                                                                    \n",
       "000e3ee6e04a8b18871e1c85ffab6e49       0.0       0.0        0.0       0.0   \n",
       "000eba50dc8c2e3899070c6b82986814       0.0       0.0        0.0       0.0   \n",
       "00139506cbd54b670e1e6dec234190e1       0.0       0.0        0.0       0.0   \n",
       "0014fdb3625079de4a0d2131fd860641       0.0       0.0        0.0       0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9       0.0       0.0        0.0       0.0   \n",
       "\n",
       "                                  FTR2_std  FTR3_mean      ...       \\\n",
       "PERSONID                                                   ...        \n",
       "000e3ee6e04a8b18871e1c85ffab6e49       0.0        0.0      ...        \n",
       "000eba50dc8c2e3899070c6b82986814       0.0        0.0      ...        \n",
       "00139506cbd54b670e1e6dec234190e1       0.0        0.0      ...        \n",
       "0014fdb3625079de4a0d2131fd860641       0.0        0.0      ...        \n",
       "001de94e8d0d152e26ad87cb409003f9       0.0        0.0      ...        \n",
       "\n",
       "                                  FTR50_mean  FTR50_sum  FTR50_std  \\\n",
       "PERSONID                                                             \n",
       "000e3ee6e04a8b18871e1c85ffab6e49    0.000000   0.000000   0.000000   \n",
       "000eba50dc8c2e3899070c6b82986814    0.000000   0.000000   0.000000   \n",
       "00139506cbd54b670e1e6dec234190e1    0.000000   0.000000   0.000000   \n",
       "0014fdb3625079de4a0d2131fd860641    0.000000   0.000000   0.000000   \n",
       "001de94e8d0d152e26ad87cb409003f9    0.000138   0.008026   0.000306   \n",
       "\n",
       "                                  APPLYNO_count  FTR51_nunique  FTR51_max_med  \\\n",
       "PERSONID                                                                        \n",
       "000e3ee6e04a8b18871e1c85ffab6e49             81             42              0   \n",
       "000eba50dc8c2e3899070c6b82986814             84             48              0   \n",
       "00139506cbd54b670e1e6dec234190e1             39             21              0   \n",
       "0014fdb3625079de4a0d2131fd860641            153             51              0   \n",
       "001de94e8d0d152e26ad87cb409003f9             58             31              0   \n",
       "\n",
       "                                           FTR51_max_group  FTR51_total_med  \\\n",
       "PERSONID                                                                      \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                A0B0C6E3D0             3625   \n",
       "000eba50dc8c2e3899070c6b82986814  A7B25C10E5D3,A7B25C0E0D0             4795   \n",
       "00139506cbd54b670e1e6dec234190e1     A0B0C2E1D1,A0B0C2E0D0             2763   \n",
       "0014fdb3625079de4a0d2131fd860641                A0B0C0E0D0             6527   \n",
       "001de94e8d0d152e26ad87cb409003f9     A0B0C0E0D0,A0B0C2E4D1             2582   \n",
       "\n",
       "                                  FTR51_type_med  LABEL_unique  \n",
       "PERSONID                                                        \n",
       "000e3ee6e04a8b18871e1c85ffab6e49              16             0  \n",
       "000eba50dc8c2e3899070c6b82986814              16             0  \n",
       "00139506cbd54b670e1e6dec234190e1              16             0  \n",
       "0014fdb3625079de4a0d2131fd860641              16             2  \n",
       "001de94e8d0d152e26ad87cb409003f9              16             0  \n",
       "\n",
       "[5 rows x 160 columns]"
      ]
     },
     "execution_count": 232,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "colnames = [df_agg.columns.levels[0][i] + '_' + df_agg.columns.levels[1][j]\n",
    " for i,j in list(zip(df_agg.columns.labels[0], df_agg.columns.labels[1])) ]\n",
    "df_agg.columns = colnames\n",
    "df_agg.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_agg.to_csv('data/train_derive.csv')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('data/train_derive.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(17500, 161)"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "metadata": {},
   "outputs": [],
   "source": [
    "# df_string = data.select_dtypes(include=object)\n",
    "# str_fea = df_string.columns.values[0] # FTR51_max_group\n",
    "str_fea = \"FTR51_max_group\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "metadata": {},
   "outputs": [],
   "source": [
    "med_dic = data[str_fea].value_counts().to_dict()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 出现小于10的特征标记为一样\n",
    "# data[str_fea] = map(lambda x: x if med_dic[x]> 5 else \"same\" ,data[str_fea])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 260,
   "metadata": {},
   "outputs": [],
   "source": [
    "columns = data.columns.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 261,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(17500, 785)"
      ]
     },
     "execution_count": 261,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[[str_fea]] = data[[str_fea]].astype(str)\n",
    "dict_vec = DictVectorizer(sparse=False)\n",
    "encode_data = dict_vec.fit_transform(data[[str_fea]].to_dict(orient='records'))\n",
    "# encode_data = dict_vec.fit_transform(data[str_fea].to_dict())\n",
    "encode_data = pd.DataFrame(encode_data, columns=dict_vec.feature_names_)\n",
    "encode_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 262,
   "metadata": {},
   "outputs": [],
   "source": [
    "columns.remove(str_fea)\n",
    "data = pd.concat([encode_data,data[columns]],axis=1,join=\"inner\")\n",
    "data.to_csv('data/train_derive.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 263,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(17500, 945)"
      ]
     },
     "execution_count": 263,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 264,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data = data.loc[data[\"LABEL_unique\"]!=2,:]\n",
    "test_data = data.loc[data[\"LABEL_unique\"]==2,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 265,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(15000, 945) (2500, 945)\n"
     ]
    }
   ],
   "source": [
    "print(train_data.shape,test_data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 266,
   "metadata": {},
   "outputs": [],
   "source": [
    "model_fea = train_data.columns.tolist()\n",
    "model_fea.remove(\"LABEL_unique\")\n",
    "model_fea.remove(\"PERSONID\")\n",
    "data_y = train_data[\"LABEL_unique\"]\n",
    "data_x = train_data[model_fea]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 267,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.2, random_state=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 268,
   "metadata": {},
   "outputs": [],
   "source": [
    "# KS 曲线\n",
    "def PlotKS(preds, labels, n, asc):\n",
    "    # preds is score: asc=1\n",
    "    # preds is prob: asc=0\n",
    "\n",
    "    pred = preds  # 预测值\n",
    "    bad = labels  # 取1为bad, 0为good\n",
    "    ksds = pd.DataFrame({'bad': bad, 'pred': pred})\n",
    "    ksds['good'] = 1 - ksds.bad\n",
    "\n",
    "    if asc == 1:\n",
    "        ksds1 = ksds.sort_values(by=['pred', 'bad'], ascending=[True, True])\n",
    "    elif asc == 0:\n",
    "        ksds1 = ksds.sort_values(by=['pred', 'bad'], ascending=[False, True])\n",
    "    ksds1.index = range(len(ksds1.pred))\n",
    "    ksds1['cumsum_good1'] = 1.0 * ksds1.good.cumsum() / sum(ksds1.good)\n",
    "    ksds1['cumsum_bad1'] = 1.0 * ksds1.bad.cumsum() / sum(ksds1.bad)\n",
    "\n",
    "    if asc == 1:\n",
    "        ksds2 = ksds.sort_values(by=['pred', 'bad'], ascending=[True, False])\n",
    "    elif asc == 0:\n",
    "        ksds2 = ksds.sort_values(by=['pred', 'bad'], ascending=[False, False])\n",
    "    ksds2.index = range(len(ksds2.pred))\n",
    "    ksds2['cumsum_good2'] = 1.0 * ksds2.good.cumsum() / sum(ksds2.good)\n",
    "    ksds2['cumsum_bad2'] = 1.0 * ksds2.bad.cumsum() / sum(ksds2.bad)\n",
    "\n",
    "    # ksds1 ksds2 -> average\n",
    "    ksds = ksds1[['cumsum_good1', 'cumsum_bad1']]\n",
    "    ksds['cumsum_good2'] = ksds2['cumsum_good2']\n",
    "    ksds['cumsum_bad2'] = ksds2['cumsum_bad2']\n",
    "    ksds['cumsum_good'] = (ksds['cumsum_good1'] + ksds['cumsum_good2']) / 2\n",
    "    ksds['cumsum_bad'] = (ksds['cumsum_bad1'] + ksds['cumsum_bad2']) / 2\n",
    "\n",
    "    # ks\n",
    "    ksds['ks'] = ksds['cumsum_bad'] - ksds['cumsum_good']\n",
    "    ksds['tile0'] = range(1, len(ksds.ks) + 1)\n",
    "    ksds['tile'] = 1.0 * ksds['tile0'] / len(ksds['tile0'])\n",
    "\n",
    "    qe = list(np.arange(0, 1, 1.0 / n))\n",
    "    qe.append(1)\n",
    "    qe = qe[1:]\n",
    "\n",
    "    ks_index = pd.Series(ksds.index)\n",
    "    ks_index = ks_index.quantile(q=qe)\n",
    "    ks_index = np.ceil(ks_index).astype(int)\n",
    "    ks_index = list(ks_index)\n",
    "\n",
    "    ksds = ksds.loc[ks_index]\n",
    "    ksds = ksds[['tile', 'cumsum_good', 'cumsum_bad', 'ks']]\n",
    "    ksds0 = np.array([[0, 0, 0, 0]])\n",
    "    ksds = np.concatenate([ksds0, ksds], axis=0)\n",
    "    ksds = pd.DataFrame(ksds, columns=['tile', 'cumsum_good', 'cumsum_bad', 'ks'])\n",
    "\n",
    "    ks_value = ksds.ks.max()\n",
    "    ks_pop = ksds.tile[ksds.ks.idxmax()]\n",
    "    print ('ks_value is ' + str(np.round(ks_value, 4)) + ' at pop = ' + str(np.round(ks_pop, 4)))\n",
    "\n",
    "    # chart\n",
    "    plt.plot(ksds.tile, ksds.cumsum_good, label='cum_good',\n",
    "             color='blue', linestyle='-', linewidth=2)\n",
    "\n",
    "    plt.plot(ksds.tile, ksds.cumsum_bad, label='cum_bad',\n",
    "             color='red', linestyle='-', linewidth=2)\n",
    "\n",
    "    plt.plot(ksds.tile, ksds.ks, label='ks',\n",
    "             color='green', linestyle='-', linewidth=2)\n",
    "\n",
    "    plt.axvline(ks_pop, color='gray', linestyle='--')\n",
    "    plt.axhline(ks_value, color='green', linestyle='--')\n",
    "    plt.axhline(ksds.loc[ksds.ks.idxmax(), 'cumsum_good'], color='blue', linestyle='--')\n",
    "    plt.axhline(ksds.loc[ksds.ks.idxmax(), 'cumsum_bad'], color='red', linestyle='--')\n",
    "    plt.title('KS=%s ' % np.round(ks_value, 4) +\n",
    "              'at Pop=%s' % np.round(ks_pop, 4), fontsize=15)\n",
    "\n",
    "    plt.show()\n",
    "    return ksds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 269,
   "metadata": {},
   "outputs": [],
   "source": [
    "# lgb model\n",
    "def lgb_sklearn(train_x, test_x, train_y, test_y):\n",
    "    gbm = lgb.LGBMClassifier(objective='binary',\n",
    "                             # n_jobs=-1,\n",
    "                             is_unbalance=True,\n",
    "                             # num_threads=8,\n",
    "                             two_round=True,\n",
    "                             bagging_fraction=1,\n",
    "                             bagging_freq=1,\n",
    "                             boosting_type='gbdt',    # gbdt\n",
    "                             feature_fraction=0.8,\n",
    "                             learning_rate=0.01,\n",
    "                             # min_child_samples=10,\n",
    "                             # min_child_weight=5,\n",
    "                             # min_data_in_leaf=20,\n",
    "                             # min_split_gain=0.0,\n",
    "                             n_estimators=800,\n",
    "                             num_leaves=32,\n",
    "                             reg_alpha=0.001,      # 减少过拟合，概率分布更两极化\n",
    "                             # reg_lambda=0.00001,\n",
    "                             # subsample=0.5,     # 没有影响\n",
    "                             silent=False,\n",
    "                             verbose=2\n",
    "                             )\n",
    "    estimators = gbm.fit(train_x,train_y)\n",
    "\n",
    "    y_pred = estimators.predict_proba(test_x)[:,1]\n",
    "    y_predict = [1 if i > 0.5 else 0 for i in y_pred]\n",
    "    print(\"lgb model auc: \", roc_auc_score(test_y, y_pred))\n",
    "    print(\"lgb f1score: \",f1_score(test_y, y_predict, average='binary'))\n",
    "    PlotKS(y_pred,test_y,445,0) \n",
    "    plt.hist(y_pred)\n",
    "    plt.show()\n",
    "    return estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 270,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lgb model auc:  0.9003246753246753\n",
      "lgb f1score:  0.4463276836158192\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/lihongwang/miniconda3/envs/py3/lib/python3.6/site-packages/ipykernel_launcher.py:29: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "/Users/lihongwang/miniconda3/envs/py3/lib/python3.6/site-packages/ipykernel_launcher.py:30: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ks_value is 0.6245 at pop = 0.2903\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = lgb_sklearn(train_x, test_x, train_y, test_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 271,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 输出结果\n",
    "predict_data = test_data[model_fea]\n",
    "res = pd.DataFrame()\n",
    "res[\"id\"] = test_data[\"PERSONID\"]\n",
    "res[\"y_pred\"] = model.predict_proba(predict_data)[:,1]\n",
    "res.to_csv(\"./data/output/res.txt\",index=None,header=None,sep=\"\\t\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "197px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
